/*
 * @Author: 杰编程 2306248989@qq.com
 * @Date: 2023-07-20 14:11:08
 * @LastEditors: 杰编程 2306248989@qq.com
 * @LastEditTime: 2023-07-20 22:55:25
 * @FilePath: /lesson16/shm/shmclient.cc
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
#include "comm.hpp"

int main()
{
    // 客户端创建一个命名管道，让客户端告诉服务端你可以读了
    int ret = mkfifo(client_to_server.c_str(), mode);
    if (ret == -1)
    {
        cout << "errno:" << errno << ":" << strerror(errno) << endl;
        exit(4);
    }
    cout << "客户端创建命名管道文件成功:" << client_to_server.c_str() << endl;

    // 客户端以写的方式打开命名管道
    int wfd = open(client_to_server.c_str(), O_WRONLY);
    if (wfd == -1)
    {
        cout << "errno:" << errno << ":" << strerror(errno) << endl;
        exit(6);
    }
    cout << "客户端以写的方式打开命名管道文件成功:" << client_to_server.c_str() << endl;

    // 客户端在共享内存写完了A~Z才告诉服务端开始读取共享内存中的数据
    cout<<"客户端正在在向共享内存中写入数据"<<endl;
    init s(CLIENT);
    char *start = s.GetStart();
    int n = 0;
    char ch = 'A';
    while (n < 26)
    {
        // 循环时，表示客户端正在写入，服务端不能进行读取共享内存中的数据
        start[n] = ch + n;
        ++n;
        if(n%10==0)
            sleep(1);
            
        start[26] = 0;
    }
    // 客户端告诉服务端你可以开始读取共享内存中的数据啦

    ret = write(wfd, begin_task.c_str(), begin_task.size());
    if (ret == -1)
    {
        cout << "errno:" << errno << ":" << strerror(errno) << endl;
        exit(7);
    }
    cout << "客户端发送开始信号成功:" << client_to_server.c_str() << endl;

    sleep(40);

    // 客户端关闭管道文件
    ret = close(wfd);
    if (ret == -1)
    {
        cout << "errno:" << errno << ":" << strerror(errno) << endl;
        exit(7);
    }
    cout << "客户端关闭以读方式打开的命名管道文件成功:" << client_to_server.c_str() << endl;

    // 客户端删除管道文件
    ret = unlink(client_to_server.c_str());
    if (ret == -1)
    {
        cout << "errno:" << errno << ":" << strerror(errno) << endl;
        exit(5);
    }
    cout << "客户端删除命名管道文件成功:" << client_to_server.c_str() << endl;

    return 0;
}